/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package Algoritmo;

import Controlador.GestorVelocidad;
import Modelo.Interseccion;
import Modelo.Universo;
import java.util.ArrayList;


/**
 *
 * @author javier
 */
public abstract class Algoritmo {
    
    public ArrayList<Gen> ConvertirZonaAIndividuo(Interseccion[][] zona) {

        ArrayList<Gen> listIntersec = new ArrayList<Gen>();
        for(int i=0;i<10;i++)
        {
            for(int j=0;j<10;j++)
            {
                if(zona[i][j]!= null)
                {
                    Gen intersec = new Gen();
                    intersec.setPosX(zona[i][j].getPosX());
                    intersec.setPosY(zona[i][j].getPosY());
                    intersec.setnAutosEste(zona[i][j].getnAutosEste());
                    intersec.setnAutosNorte(zona[i][j].getnAutosNorte());
                    intersec.setnAutosOeste(zona[i][j].getnAutosOeste());
                    intersec.setnAutosSur(zona[i][j].getnAutosSur());
                    intersec.setConfiguracion(zona[i][j].getConfiguracion());
                    listIntersec.add(intersec);
                }
            }
        }        
        return listIntersec;
        
    }

    protected int/*Z*/ EvaluacionFuncionObjetivoUsandoIndividuo(ArrayList<Gen> individuo) {
        Gen g ;
        int tiempoVerdeHorizontal;
        int tiempoVerdeVertical;
        int velocidadVertical;
        int velocidadHorizontal;
        Universo u = Universo.GetInstance();
        int distanciaTotalRecorrida=0;
        for(int i=0; i<individuo.size(); i++){ //Javier 
            g = (Gen)individuo.get(i);
            int configuracionDeInterseccion = g.getConfiguracion();
            
//            tiempoVerdeHorizontal = u.ObtenerConfiguracion(configuracionDeInterseccion).
//                                    getTiempoVerdeHorizontal();
            tiempoVerdeHorizontal = Universo.GetInstance().GetTiempoIntervalHorizontal(configuracionDeInterseccion);
//            tiempoVerdeVertical = u.ObtenerConfiguracion(configuracionDeInterseccion).
//                                    getTiempoVerdeVertical();
            tiempoVerdeVertical = Universo.GetInstance().GetTiempoIntervalVertical(configuracionDeInterseccion);
            velocidadHorizontal = obtenerVelocidadLimiteHor(individuo.get(i).getPosX(), individuo.get(i).getPosY());
            
            velocidadVertical = obtenerVelocidadLimiteVer(individuo.get(i).getPosX(), individuo.get(i).getPosY());
            
            int distanciaAportada = tiempoVerdeHorizontal *velocidadHorizontal* (g.getnAutosEste()+g.getnAutosOeste()) 
                                   +tiempoVerdeVertical *velocidadVertical* (g.getnAutosNorte()+g.getnAutosSur());
            distanciaTotalRecorrida+= distanciaAportada;
        }
        //System.out.println("Z="+ distanciaTotalRecorrida);
        return distanciaTotalRecorrida;
    }
    
    
    protected int obtenerVelocidadLimiteHor(int posX, int posY) {
        GestorVelocidad gestorVelocidad = GestorVelocidad.getInstance();
        return gestorVelocidad.ObtenerVelocidadMaximaHorizontal(posY);
    }
    protected int obtenerVelocidadLimiteVer(int posX, int posY) {
        GestorVelocidad gestorVelocidad = GestorVelocidad.getInstance();
        return gestorVelocidad.ObtenerVelocidadMaximaVertical(posX);
    }
    
    
}
